﻿package com.ghost.view.content_menu
{	
	import com.ghost.event.EasyContextMenuEvent;
	
	import flash.display.*;
	import flash.events.*;
	import flash.net.*;
	import flash.ui.*;
	

	/**
	 * ... 自定义右键菜单类 ...
	 * @author Jerry Lee
	 * @version 1.0.1
	 */
	public class EasyContextMenu extends EventDispatcher {
		
		/** @private 右键菜单触发对象 */
		private var _target:InteractiveObject;
		
		/** @private 右键菜单 */
		private var _menu:ContextMenu;
		
		/** @private 菜单项列表 */
		private var _itemList:Array = [];
		
		/**
		 * 构造函数
		 * @param	target 一个交互对象，被添加右键菜单的目标对象
		 * @param	removeBuiltInItems 一个布尔值，确定是否需要删除系统默认右键菜单
		 */
		public function EasyContextMenu(target:InteractiveObject, removeBuiltInItems:Boolean = true){
			_target = target;
			_menu = new ContextMenu();
			_target.contextMenu = _menu;
			if (removeBuiltInItems)
				_menu.hideBuiltInItems();
		}
		
		/**
		 * 添加回调方法菜单项
		 * @param	caption 一个字符串，菜单项名称
		 * @param	callback 一个函数，回调方法
		 * @param	separatorBefore 一个布尔值，在菜单项之前是否添加分割线
		 * @param	enabled 一个布尔值，菜单项是否可操作
		 * @param	visible 一个布尔值，菜单项是否可见
		 */
		public function addCallbackMenuItem(caption:String, callback:Function = null, separatorBefore:Boolean = false, enabled:Boolean = true, visible:Boolean = true):void 
		{
			var item:ContextMenuItem = createMenuItem(caption, separatorBefore, enabled, visible);
			createEasyContextMenuItem(item, EasyContextMenuItem.MENU_ITEM_CALLBACK, callback);
		}
		
		/**
		 * 添加链接菜单项
		 * @param	caption 一个字符串，菜单项名称
		 * @param	link 一个字符串，链接地址
		 * @param	window 一个字符串，确定打开链接的窗口模式
		 * @param	separatorBefore 一个布尔值，在菜单项之前是否添加分割线
		 * @param	enabled 一个布尔值，菜单项是否可操作
		 * @param	visible 一个布尔值，菜单项是否可见
		 */
		public function addLinkMenuItem(caption:String, link:String = null, window:String = "_balnk", separatorBefore:Boolean = false, enabled:Boolean = true, visible:Boolean = true):void 
		{
			var item:ContextMenuItem = createMenuItem(caption, separatorBefore, enabled, visible);
			createEasyContextMenuItem(item, EasyContextMenuItem.MENU_ITEM_LINK, null, link, window);
		}
		
		/**
		 * 设定指定菜单项可用/不可用方法
		 * @param	caption 一个字符串，菜单项名称
		 * @param	enabled 一个布尔值，菜单项是否可操作
		 */
		public function setItemEnabled(caption:String, enabled:Boolean = true):void 
		{
			var itemsArr:Array = _menu.customItems;
			for each(var item:ContextMenuItem in itemsArr) 
			{
				if (item.caption == caption) {
					item.enabled = enabled;
					return;
				}
			}
		}
		
		/**
		 * 设定指定菜单项可见/不可见方法
		 * @param	caption 一个字符串，菜单项名称
		 * @param	visible 一个布尔值，菜单项是否可见
		 */
		public function setItemVisible(caption:String, visible:Boolean = true):void
		{
			var itemsArr:Array = _menu.customItems;
			for each(var item:ContextMenuItem in itemsArr) 
			{
				if (item.caption == caption) {
					item.visible = visible;
					return;
				}
			}
		}
		
		/**
		 * 移除菜单项
		 * @param	caption 一个字符串，菜单项名称
		 */
		public function removeMenuItem(caption:String):void 
		{
			var itemsArr:Array = _menu.customItems;
			for (var i:Object in _itemList) {
				var item:EasyContextMenuItem = _itemList[i];
				if (item.item.caption == caption) {
					item.dispose();
					item = null;
					_itemList.splice(i, 1);
					break;
				}
			}
			for (i in itemsArr) {
				var contextItem:ContextMenuItem = itemsArr[i];
				if (contextItem.caption == caption) {
					contextItem = null;
					itemsArr.splice(i, 1);
					return;
				}
			}
		}
		
		/**
		 * 销毁对象方法
		 */
		public function dispose():void 
		{
			var itemsArr:Array = _menu.customItems;
			for (var i:Object in _itemList) {
				var item:EasyContextMenuItem = _itemList[i];
				item.dispose();
				item = null;
			}
			for (i in itemsArr) {
				var contextItem:ContextMenuItem = itemsArr[i];
				contextItem = null;
			}
			itemsArr = _itemList = null;
			_target.contextMenu = null;
		}
		
		/**
		 * 创建菜单项
		 * @param	caption  一个字符串，菜单项名称
		 * @param	separatorBefore  一个布尔值，在菜单项之前是否添加分割线
		 * @param	enabled 一个布尔值，菜单项是否可操作
		 * @param	visible 一个布尔值，菜单项是否可见
		 * @return
		 */
		private function createMenuItem(caption:String, separatorBefore:Boolean = false, enabled:Boolean = true, visible:Boolean = true):ContextMenuItem 
		{
			var item:ContextMenuItem = new ContextMenuItem(caption, separatorBefore, enabled, visible);
			for each (var menuItem:ContextMenuItem in _menu.customItems) 
			{
				if (menuItem.caption == caption) {
					throw "对不起，菜单项重复！";
				}
			}
			_menu.customItems.push(item);
			return item;
		}
		
		/**
		 * 创建EasyContextMenuItem
		 * @param	item 一个ContextMenuItem对象，需创建的菜单对象
		 * @param	callback 一个函数，回调方法
		 * @param	link 一个字符串，链接地址
		 * @param	window 一个字符串，打开链接的窗口模式
		 */
		private function createEasyContextMenuItem(item:ContextMenuItem, type:String, callback:Function = null, link:String = null, window:String = null):void
		{
			var itemObj:EasyContextMenuItem = new EasyContextMenuItem(item, type);
			itemObj.callback = callback;
			itemObj.link = link;
			itemObj.window = window;
			itemObj.addEventListener(EasyContextMenuEvent.MENU_ITEM_SELECT, menuItemSelectHandler);
			_itemList.push(itemObj);
		}
		
		/**
		 * 菜单项选择事件调度
		 * @param	e 一个EasyContextMenuEvent事件对象
		 */
		private function menuItemSelectHandler(e:EasyContextMenuEvent):void 
		{
			var type:String = e.itemType;
			var callback:Function = e.callback;
			var link:String = e.link;
			var window:String = e.window;
			switch (type) 
			{
				case EasyContextMenuItem.MENU_ITEM_CALLBACK:
					if (callback != null)
						callback();
					break;
					
				case EasyContextMenuItem.MENU_ITEM_LINK:
					if (link)
						navigateToURL(new URLRequest(link), window);
					break;
			}
		}
	}

}